package com.atguigu.shangrongbao.core.controller.api;


import com.atguigu.common.exception.Assert;
import com.atguigu.common.exception.BusinessException;
import com.atguigu.common.result.R;
import com.atguigu.common.result.ResponseEnum;
import com.atguigu.common.util.RegexValidateUtils;
import com.atguigu.shangrongbao.core.pojo.entity.UserInfo;
import com.atguigu.shangrongbao.core.pojo.vo.LoginVo;
import com.atguigu.shangrongbao.core.pojo.vo.RegisterVo;
import com.atguigu.shangrongbao.core.pojo.vo.UserInfoVO;
import com.atguigu.shangrongbao.core.service.UserInfoService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.regex.RegexUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 用户基本信息 前端控制器
 * </p>
 *
 * @author Author
 * @since 2021-08-10
 */
@Slf4j
@RestController
@RequestMapping("/api/core/userInfo")
public class UserInfoController {

    @Autowired
    private UserInfoService userInfoService;

    @Resource
    private RedisTemplate redisTemplate;

    @ApiOperation(value = "注册", tags = "注册")
    @PostMapping("/register")
    public R register(@RequestBody RegisterVo registerVo){
        String code = registerVo.getCode();
        String mobile = registerVo.getMobile();
        String password = registerVo.getPassword();
        Integer userType = registerVo.getUserType();
        //1.判断手机号是否存在
        Assert.isNotNull(mobile, ResponseEnum.MOBILE_NULL_ERROR);

        //2.判断手机号是否合法
        Assert.isTrue(RegexValidateUtils.checkMobile(mobile), ResponseEnum.MOBILE_ERROR);
        //3.判断密码是否存在
        Assert.isNotNull(password, ResponseEnum.PASSWORD_NULL_ERROR);
        //4.判断密码是否合法,有要求需要校验

        //5.判断验证码是否存在
        Assert.isNotNull(code, ResponseEnum.CODE_NULL_ERROR);
        //6.判断验证码是否正确，一般是四位或6位数字
        log.info("验证码：{}",code);
        Assert.equals(code, redisTemplate.opsForValue().get("SmsController:sendMessage:"+ mobile), ResponseEnum.CODE_ERROR);
        //7.查询手机号是否已经注册 这部在service层做

        //8.调用service插入数据（这里插入用户信息表，还要关联用户账户表存入对应userId）
        userInfoService.register(registerVo);
        return  R.ok("注册成功");
    }

    @PostMapping("/login")
    public R login(@RequestBody LoginVo loginVo){
        //手机号
        String mobile = loginVo.getMobile();
        //密码
        String password = loginVo.getPassword();
        //用户类型
        Integer userType = loginVo.getUserType();

        //1.判断参数是否何合法
        Assert.notEmpty(mobile, ResponseEnum.MOBILE_NULL_ERROR);
        //判断手机号是否合法
        Assert.isTrue(RegexValidateUtils.checkMobile(mobile), ResponseEnum.MOBILE_ERROR);

        //2.查询用户是否存在（service层做）login应该返回用户信息
        UserInfoVO userInfoVO = userInfoService.login(loginVo);

        //3.比对密码是否正确

        //4.调用service 插入登录日志数据

        //5.返回前端数据(token,以及其他的用户信息)

        return R.ok("登录成功").put("data", userInfoVO);
    }

    @GetMapping("/{userId}")
    public UserInfo getUserInfoByUserId(@PathVariable("userId") Long userId){
        // userInfoService
        UserInfo userInfo = userInfoService.getById(userId);

        log.info("userInfo:{}", userInfo);
        return null;
    }

    public R getUserList(){
         // userInfoService.
        return null;
    }

    /**
     * 校验手机号是否存在
     * @return
     */
    @GetMapping("/check/{mobile}")
    public Boolean checkMobile(@PathVariable("mobile") String mobile){
        Boolean isExit = userInfoService.checkMobile(mobile);
        log.info("查询手机号：{}", isExit);
        return isExit;
    }
}

